Stopwatch for Liberty BASIC 4!

by Bill Beasley, Janet Terra, Stefan Pendl and Gordon Sweet

Home

Tips For the Hobbyist

Nally's Applications

Measuring an Angle

Maphandle Listboxes

About GUIs

Convert Old Code

Installing Fonts

Tip Corner

Stopwatch for LB4

Run with Params

Newsletter help

Index


Community

This demo was constructed on the public forum, with input from several members. The spirit of sharing in the community benefits everyone! The demo also shows how the creation of structured code that is self-documented makes it easy for others to read, understand, and modify a program.

Liberty BASIC 4

We'll be seeing a lot more code that is specific to LB 4 now that it has been released officially. This program makes good use of the ability to declare global variables, and the ability to give names to drawing segments when FLUSHing them.

Thanks to all who participated for giving their permission to include this demo in the issue.

' --- start of code
' Stop Watch simulation
'
' based on Janet Terra's Blood Pressure Dial
'
' Revision History
' ================
'
' Revision | Date     | Name         | Reason
' ---------|----------|--------------|--------------------------------------
' 1.0      |          | Gordon Sweet | Initial
' 1.1      |          | Bill Beasley | Ported to LB4, timer update, default
'                                    | button update.
' 1.2      | 24.10.03 | Stefan Pendl | Added reset, current time display
'                                    | update, flushed
' 1.3      | 24OCT03  | Bill Beasley | Added event time splitting, segment
'                                    | naming.


    nomainwin
    '----- Set Up GUI -----
    button #w.start, " START ", [start], ul, 100, 50
    button #w.reset, " RESET ", [reset], ul, 100, 100
    button #w.stop, " STOP ", [stop], ul, 620, 50
    button #w.split, " SPLIT", [split], ul, 620, 100


    WindowWidth = 800 : WindowHeight = 600
    UpperLeftX = int((DisplayWidth-WindowWidth)/2)
    UpperLeftY = int((DisplayHeight-WindowHeight)/2)


    graphicbox #w.gb 0, 0, WindowWidth-8 ,WindowHeight-27
    open "Stop Watch" for window_nf as #w
    #w "trapclose [quit]"
    #w "resizehandler [Resized]" ' redraw if window was minimized
    #w.gb "font arial 14 bold"
    #w.gb "down; fill 0 0 120"
    #w.start "!setfocus"


    '----- Display Timer Face -----
    #w.gb "home; size 2; circlefilled 200"
    #w.gb "color red; home; size 3; circle 195"
    #w.gb "home; size 2; north; go 194"
        For Angle = 0 to 359 step 6
           #w.gb "home; turn 6; go 194"
        Next Angle
    #w.gb "color white; home; circlefilled 170"
    #w.gb "backcolor 0 0 120"
    #w.gb "size 3; place 390 75 "
    #w.gb "\0"
    #w.gb "place 605 290 "
    #w.gb "\15"
    #w.gb "place 385 505 "
    #w.gb "\30"
    #w.gb "place 170 290 "
    #w.gb "\45"
    #w.gb "home; size 2; color black; circlefilled 10"
    #w.gb "flush ElapseTimerBody"
    #w.gb "home; north; go 170"


    Global ElapsedSeconds, ElapsedMinutes, IsRunning


    ElapsedSeconds = 0
    ElapsedMinutes = 0
    IsRunning = 0
    First = 1
    Angle = 0


    TIMER 1000, [TimerEvent]


[TimerEvent]
    GoSub [DisplayCurrentTime]
    if IsRunning = 1 or First = 1 then
        GoSub [DisplayElapsedTime]
        GoSub [DisplaySweep]
        First = 0
    end if
    Scan
    WAIT


[quit]
    TIMER 0
    CLOSE #w
end


[Resized]
    #w.gb "redraw ElapseTimerBody"
    goto [TimerEvent]


[DisplaySweep]
    Angle = (ElapsedSeconds -1) * 6
    #w.gb "backcolor white; home; circlefilled 170"
    #w.gb "color black; home; north; turn "; Angle
    #w.gb "go 170; home; backcolor 0 0 120; circlefilled 10"
    Return


[DisplayElapsedTime]
    #w.gb "color white; place 240 40"
    #w.gb "\Elapsed Time: "; ElapsedMinutes;"  Minutes ";_
        format$(ElapsedSeconds); " Seconds"
    ElapsedSeconds = ElapsedSeconds + 1
    If ElapsedSeconds = 60 then
       ElapsedMinutes = ElapsedMinutes + 1
       ElapsedSeconds = 0
    End If
    Return


[DisplayCurrentTime]
    #w.gb "color white; place 215 543"
    #w.gb "\Current Time: "; Time$(); "   Date: "; Date$()
    Return


[start]
    #w.stop "!setfocus"
    TIMER 1000, [TimerEvent]
    IsRunning = 1
    WAIT


[reset]
    #w.start "!setfocus"
    ElapsedSeconds = 0
    ElapsedMinutes = 0
    IsRunning = 0
    Angle = 0
    First = 1
    REDIM SplitTime(4,2)
    splitevent = 0
    #w.gb "redraw ElapseTimerBody"
    goto [TimerEvent]


[split]
    If IsRunning Then
        SplitTime(splitevent, 0) = ElapsedMinutes
        SplitTime(splitevent, 1) = ElapsedSeconds
        splitevent = splitevent + 1
        #w.gb "font arial 12"
        #w.gb "color white bold"
        Select Case splitevent
            Case 1
                #w.gb "place 620 150" : #w.gb "\Split ";_
                splitevent; " -   "; SplitTime(splitevent-1, 0);_
                ":"; format$(SplitTime(splitevent-1, 1))
            Case 2
                #w.gb "place 620 170" : #w.gb "\Split ";_
                splitevent; " -   "; SplitTime(splitevent-1, 0);_
                ":"; format$(SplitTime(splitevent-1, 1))
            Case 3
                #w.gb "place 620 190" : #w.gb "\Split ";_
                splitevent; " -   "; SplitTime(splitevent-1, 0);_
                ":"; format$(SplitTime(splitevent-1, 1))
            Case Else
                #w.gb "place 620 210" : #w.gb "\Split ";_
                splitevent; " -   "; SplitTime(splitevent-1, 0);_
                ":"; format$(SplitTime(splitevent-1, 1))
                splitevent = 0
        End Select
        #w.stop "!setfocus"
        #w.gb "font arial 14 bold"
    End If
    WAIT


[stop]
    #w.start "!setfocus"
    IsRunning = 0
    WAIT


Function format$(secs)
    Select Case LEN(STR$(secs))
        Case 1
            format$ = "0" + STR$(secs)
        Case 2
            format$ = STR$(secs)
    End Select
End Function
' --- end of code


Home

Tips For the Hobbyist

Nally's Applications

Measuring an Angle

Maphandle Listboxes

About GUIs

Convert Old Code

Installing Fonts

Tip Corner

Stopwatch for LB4

Run with Params

Newsletter help

Index